package com.jdjc.subject.common.context;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 登录上下文对象
 */
public class LoginContextHolder {
    // 使用InheritableThreadLocal来存储线程局部变量，允许子线程继承父线程的值。
    private static final InheritableThreadLocal<Map<String, Object>> THREAD_LOCAL
            = new InheritableThreadLocal<>();

    // 定义一个公共静态方法，用于设置线程局部变量的值。
    public static void set(String key, Object value) {
        Map<String, Object> map = getThreadLocalMap(); // 获取当前线程的Map。
        map.put(key, value); // 将键值对添加到Map中。
    }

    // 定义一个公共静态方法，用于获取线程局部变量的值。
    public static Object get(String key) {
        Map<String, Object> map = getThreadLocalMap(); // 获取当前线程的Map。
        return map.get(key);
    }

    // 定义一个公共静态方法，用于获取登录用户的ID。
    public static String getLoginId() {
        return (String) getThreadLocalMap().get("loginId"); // 返回Map中与键"loginId"关联的值，并将其转换为字符串类型。
    }

    // 移除当前线程的InheritableThreadLocal实例。
    public static void remove() {
        THREAD_LOCAL.remove();
    }

    //用于获取当前线程的Map。
    public static Map<String, Object> getThreadLocalMap() {
        // 尝试获取当前线程的Map。
        Map<String, Object> map = THREAD_LOCAL.get();
        // 如果Map为空，则创建一个新的ConcurrentHashMap。并将新的Map设置为当前线程的Map。
        if (Objects.isNull(map)) {

            map = new ConcurrentHashMap<>();
            THREAD_LOCAL.set(map);
        }
        return map;
    }
}